import { defineStore } from 'pinia'
const useSocketStore = defineStore(
    'socket',
    {
      state: () => ({
        ws: new WebSocket('/tokenWebsocket'),
        heartTimeOut: 40000, //监测心跳时间 40秒
        //this.isReConnection = false
        lockReconnect: false, //避免重连
        timerReconnect: setTimeout(()=>{}, 0),
        timerHeart: setTimeout(()=>{}, 0),
        timerServerHeart: undefined,
        handClose: false,
        msg: ""
      }),
      actions: {
        connection(url?:any, token?:any){
          if("WebSocket" in window){
            this.createWebSocket(url, token)
          }
          else{
            
          }    
        },
      
        //初始化
        createWebSocket(url:string, token:string){
          try{
            this.ws = new WebSocket(url, token)  // 
            
            this.initWebsocket()
            
          }
          catch(e){
            console.log("catch eeeee=", e)
            this.reConnection()
          }
        },
      
        initWebsocket(){
      
          //建立连接
          this.ws.onopen = ()=>{
           
            //webSocket业务订阅——可以有多个业务
            this.ws.send("hello server");
            console.log("连接成功")
            //连接成功后，需要开启监测心跳
            this.heartCheck()
          }
      
          this.ws.onmessage = (messages)=>{
           
            console.log(messages.data)
            let msg = messages.data
            if(msg.includes("{")){
              msg = JSON.parse(msg)
            }
            this.msg = msg
  
            //接收到消息后，需要开启监测心跳
            this.heartCheck()
          }
      
        
          this.ws.onerror = ()=>{       //连不上时onerror 和 onclose 监听同时会捕捉到
            console.log("连接失败")
            // 连失败需要重连
            this.reConnection()
          }
      
          this.ws.onclose = ()=>{
            console.log("关闭连接")
           
            //是否正常关闭  正常关闭不需要重连， 否则需要重连
            if(!this.handClose){
              this.reConnection()
            }
          }
        },
      
        clearTimer(){
          this.timerReconnect && clearTimeout(this.timerReconnect)
          this.timerHeart && clearTimeout(this.timerHeart)
          this.timerServerHeart && clearTimeout(this.timerServerHeart)
        },
      
        //重连
        reConnection(){
          console.log("重新连接")
          if(this.lockReconnect){
            return
          }
          this.lockReconnect = true
          if(this.timerReconnect) {
            clearTimeout(this.timerReconnect)
          } 
      
          //没连上会一直重连， 设置迟延，避免请求过多
          this.timerReconnect = setTimeout(() => { //setTimeout 到点了执行
            this.connection()
            this.lockReconnect = false
          }, 5000);
          
        },
        
      
        //心跳
        heartCheck(){
          console.log("监测心跳")
          if(this.timerHeart){
            clearTimeout(this.timerHeart)
          }
      
          // if(this.timerServerHeart){
          //   clearTimeout(this.timerServerHeart)
          // }
      
          this.timerHeart = setTimeout(() => {
            console.log("PING");
            this.ws.send("PING");
      
            // this.timerServerHeart = setTimeout(() => {
            //   // 断了
            //   this.ws.close()
            // }, 5000);
      
            this.lockReconnect = false
          }, this.heartTimeOut); //40秒
      
        },
      
        //发送消息
        sendMsg(data:any){
          console.log("发送消息")
          if(this.ws.readyState === WebSocket.OPEN){
            this.ws.send(JSON.stringify(data))
          }
        },
      
        //关闭连接 手动关闭
        closeWs(){
          console.log("手动关闭ws")
          this.handClose = true
          this.clearTimer()
          this.ws.close()
        }
      }
    })
  
  export default useSocketStore